{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "secondary-vatican",
   "metadata": {},
   "source": [
    "# Loading Image Dataset\n",
    "\n",
    "`Linux` `Ascend` `GPU` `CPU` `Data Preparation` `Beginner` `Intermediate` `Expert`\n",
    "\n",
    "[![](https://gitee.com/mindspore/docs/raw/master/tutorials/training/source_en/_static/logo_source.png)](https://gitee.com/mindspore/docs/blob/master/tutorials/training/source_en/use/load_dataset_image.ipynb)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "demographic-concentrate",
   "metadata": {},
   "source": [
    "## Overview\n",
    "\n",
    "In computer vision training tasks, it is often difficult to read the entire dataset directly into memory due to memory capacity. The `mindspore.dataset` module provided by MindSpore enables users to customize their data fetching strategy from disk. At the same time, data processing and data augmentation operators are applied to the data. Pipelined data processing produces a continuous flow of data to the training network, improving overall performance.\n",
    "\n",
    "In addition, MindSpore supports data loading in distributed scenarios. Users can define the number of shards while loading. For more details, see [Loading the Dataset in Data Parallel Mode](https://www.mindspore.cn/tutorial/training/en/master/advanced_use/distributed_training_ascend.html#loading-the-dataset-in-data-parallel-mode).\n",
    "\n",
    "This tutorial uses the MNIST dataset [1] as an example to demonstrate how to load and process image data using MindSpore.\n",
    "\n",
    "## Preparations\n",
    "\n",
    "### Importing Module\n",
    "\n",
    "This module provides APIs to load and process data sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "bigger-airfare",
   "metadata": {},
   "outputs": [],
   "source": [
    "import mindspore.dataset as ds"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "proud-culture",
   "metadata": {},
   "source": [
    "### Downloading Dataset\n",
    "\n",
    "Run the following command to download the training images and labels of the MNIST dataset and unzip them, put them in the path `./datasets/MNIST_Data`, the directory structure is as follows:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "several-coordinator",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "./datasets/MNIST_Data\n",
      "├── test\n",
      "│   ├── t10k-images-idx3-ubyte\n",
      "│   └── t10k-labels-idx1-ubyte\n",
      "└── train\n",
      "    ├── train-images-idx3-ubyte\n",
      "    └── train-labels-idx1-ubyte\n",
      "\n",
      "2 directories, 4 files\n"
     ]
    }
   ],
   "source": [
    "!mkdir -p ./datasets/MNIST_Data/train ./datasets/MNIST_Data/test\n",
    "!wget -NP ./datasets/MNIST_Data/train https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/train-labels-idx1-ubyte\n",
    "!wget -NP ./datasets/MNIST_Data/train https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/train-images-idx3-ubyte\n",
    "!wget -NP ./datasets/MNIST_Data/test https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/t10k-labels-idx1-ubyte\n",
    "!wget -NP ./datasets/MNIST_Data/test https://mindspore-website.obs.myhuaweicloud.com/notebook/datasets/mnist/t10k-images-idx3-ubyte\n",
    "!tree ./datasets/MNIST_Data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "controlling-digest",
   "metadata": {},
   "source": [
    "## Loading Dataset\n",
    "\n",
    "MindSpore supports loading common datasets in the field of image processing that come in a variety of on-disk formats. Users can also implement custom dataset class to load customized data. For the detailed loading method of various datasets, please refer to the [Loading Dataset](https://www.mindspore.cn/doc/programming_guide/en/master/dataset_loading.html) in the programming guide.\n",
    "\n",
    "The following tutorial shows how to load the MNIST dataset using the `MnistDataset` in the `mindspore.dataset` module.\n",
    "\n",
    "1. Configure the dataset directory and create the `MnistDataset`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "burning-broadcast",
   "metadata": {},
   "outputs": [],
   "source": [
    "    DATA_DIR = './datasets/MNIST_Data/train'\n",
    "    mnist_dataset = ds.MnistDataset(DATA_DIR, num_samples=6, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "beneficial-dispatch",
   "metadata": {},
   "source": [
    "2. Create an iterator then obtain data through the iterator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "royal-catalog",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "    import matplotlib.pyplot as plt\n",
    "\n",
    "    mnist_it = mnist_dataset.create_dict_iterator()\n",
    "    data = next(mnist_it)\n",
    "    plt.imshow(data['image'].asnumpy().squeeze(), cmap=plt.cm.gray)\n",
    "    plt.title(data['label'].asnumpy(), fontsize=20)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "metropolitan-vacuum",
   "metadata": {},
   "source": [
    "In addition, users can pass in a `sampler` parameter to specify the sampling process during dataset loading. For the data samplers supported by MindSpore and their detailed usage methods, please refer to the programming guide [sampler](https://www.mindspore.cn/doc/programming_guide/en/master/sampler.html).\n",
    "\n",
    "## Processing Data\n",
    "\n",
    "For the data processing operators currently supported by MindSpore and their detailed usage methods, please refer to the [Processing Data](https://www.mindspore.cn/doc/programming_guide/en/master/pipeline.html) in the programming guide.\n",
    "\n",
    "The following tutorial demonstrates how to construct a pipeline and perform operations such as `shuffle`, `batch` and `repeat` on the MNIST dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "japanese-equity",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "5\n",
      "0\n",
      "4\n",
      "1\n",
      "9\n",
      "2\n"
     ]
    }
   ],
   "source": [
    "for data in mnist_dataset.create_dict_iterator():\n",
    "    print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "mexican-sport",
   "metadata": {},
   "source": [
    "1. Shuffle the dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "documented-romance",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after shuffle: \n",
      "4\n",
      "2\n",
      "1\n",
      "0\n",
      "5\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "    ds.config.set_seed(58)\n",
    "    ds1 = mnist_dataset.shuffle(buffer_size=6)\n",
    "\n",
    "    print('after shuffle: ')\n",
    "    for data in ds1.create_dict_iterator():\n",
    "        print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "inner-summit",
   "metadata": {},
   "source": [
    "2. Add `batch` after `shuffle`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "terminal-danish",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after batch: \n",
      "[4 2]\n",
      "[1 0]\n",
      "[5 9]\n"
     ]
    }
   ],
   "source": [
    "    ds2 = ds1.batch(batch_size=2)\n",
    "\n",
    "    print('after batch: ')\n",
    "    for data in ds2.create_dict_iterator():\n",
    "        print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "adapted-metallic",
   "metadata": {},
   "source": [
    "3. Add `repeat` after `batch`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "freelance-witness",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after repeat: \n",
      "[4 2]\n",
      "[1 0]\n",
      "[5 9]\n",
      "[2 4]\n",
      "[0 9]\n",
      "[1 5]\n"
     ]
    }
   ],
   "source": [
    "    ds3 = ds2.repeat(count=2)\n",
    "\n",
    "    print('after repeat: ')\n",
    "    for data in ds3.create_dict_iterator():\n",
    "        print(data['label'])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "republican-silence",
   "metadata": {},
   "source": [
    "The results show the dataset is repeated, and the order of the replica is different from that of the first copy.\n",
    "\n",
    "> Having `repeat` in the pipeline results in the execution of repeated operations defined in the entire pipeline, instead of simply copying the current dataset. So the order of the replica is different from that of the first copy after `shuffle`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "expensive-stand",
   "metadata": {},
   "source": [
    "## Augmentation\n",
    "\n",
    "For the data augmentation operators supported by MindSpore and their detailed usage methods, please refer to the programming guide [Data Augmentation](https://www.mindspore.cn/doc/programming_guide/en/master/augmentation.html).\n",
    "\n",
    "The following tutorial demonstrates how to use the `c_transforms` module to augment data in the MNIST dataset.\n",
    "\n",
    "1. Import related modules and load the dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "fifteen-secretariat",
   "metadata": {},
   "outputs": [],
   "source": [
    "    from mindspore.dataset.vision import Inter\n",
    "    import mindspore.dataset.vision.c_transforms as transforms\n",
    "\n",
    "    mnist_dataset = ds.MnistDataset(DATA_DIR, num_samples=6, shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "accompanied-biology",
   "metadata": {},
   "source": [
    "2. Define augmentation operators and perform the `Resize` and `RandomCrop` operations on images in the dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10 ,
   "id": "defensive-monday",
   "metadata": {},
   "outputs": [],
   "source": [
    "    resize_op = transforms.Resize(size=(200,200), interpolation=Inter.LINEAR)\n",
    "    crop_op = transforms.RandomCrop(150)\n",
    "    transforms_list = [resize_op, crop_op]\n",
    "    ds4 = mnist_dataset.map(operations=transforms_list,input_columns='image')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "hollow-grain",
   "metadata": {},
   "source": [
    "3. Visualize the result of augmentation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "stable-leonard",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "    mnist_it = ds4.create_dict_iterator()\n",
    "    data = next(mnist_it)\n",
    "    plt.imshow(data['image'].asnumpy().squeeze(), cmap=plt.cm.gray)\n",
    "    plt.title(data['label'].asnumpy(), fontsize=20)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "creative-liberal",
   "metadata": {},
   "source": [
    "The original image is scaled up then randomly cropped to 150 x 150.\n",
    "\n",
    "## References\n",
    "\n",
    "[1] Y. LeCun, L. Bottou, Y. Bengio, and P. Haffner. [Gradient-based learning applied to document recognition](http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf)."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "MindSpore-1.1.1",
   "language": "python",
   "name": "mindspore-1.1.1"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
